iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
tags: .NET6 C#, LineBot, Line Messaging API, C#, dotnet core

[Day 25] 讓 C# 也能很 Social - .NET 6 C# 與 Line Services API 開發 - Line Pay 串接 (二)

前言

上一篇的內容中,我們建立了一般的付款流程,本篇內容就是介紹如何使用 Line Pay 建立一個 定期付款 功能,剩下會補充介紹 Line Pay 另外提供的幾支 API

建立自動付款相關 API

所謂自動付款就是此筆週期性交易第一次完成後,Line Pay 會提供此交易的 RegKey,利用此 key 就能向 Line Pay 再次請款。

而建立此種週期性交易,必須送出交易請求時將 options.payment.payType 屬性設為 PREAPPROVED,則此交易 confirm 後就會回傳 RegKey。

當取得該交易的 RegKey 後,週期請款流程如下圖所示。

以下為三支相關的 API

Check RegKey 文件連結

首先在使用 RegKey 進行自動付款前,使用此 API 檢查 RegKey 狀態是否有效。

  • 文件內容

  • LinePayService 中新增 CheckRegKey function

public async Task<PaymentConfirmResponseDto> CheckRegKey(string regKey)
{
    var nonce = Guid.NewGuid().ToString();
    var requestUrl = string.Format("/v3/payments/preapprovedPay/{0}/check", regKey);
    var request = new HttpRequestMessage(HttpMethod.Get, linePayBaseApiUrl + requestUrl);
    var result = SignatureProvider.HMACSHA256(channelSecretKey, channelSecretKey + requestUrl + nonce);
    client.DefaultRequestHeaders.Add("X-LINE-ChannelId", channelId);
    client.DefaultRequestHeaders.Add("X-LINE-Authorization-Nonce", nonce);
    client.DefaultRequestHeaders.Add("X-LINE-Authorization", result);
    var response = await client.SendAsync(request);

    return _jsonProvider.Deserialize<PaymentConfirmResponseDto>(await response.Content.ReadAsStringAsync());
}
  • LinePayController 內新增 API
[HttpGet("CheckRegKey/{regKey}")]
public async Task<PaymentConfirmResponseDto> CheckRegKey(string regKey)
{
    return await _linePayService.CheckRegKey(regKey);
}

Pay Preapproved 文件連結

此 API 帶入 regKey 與 request Body 後,即可自動完成一筆相同交易。

  • 文件內容

  • 根據文件,建立 PayPreapprovedDto class

namespace LineBotMessage.Dtos
{
    public class PayPreapprovedDto
    {
        public string ProductName { get; set; }
        public int Amount { get; set; }
        public string Currency { get; set; }
        public string OrderId { get; set; }
        public bool? Capture { get; set; }
    }
}
  • LinePayService 中新增 PayPreapproved function
public async Task<PaymentConfirmResponseDto> PayPreapproved(string regKey, PayPreapprovedDto dto)
{
    var json = _jsonProvider.Serialize(dto);
    var nonce = Guid.NewGuid().ToString();
    var requestUrl = string.Format("/v3/payments/preapprovedPay/{0}/payment", regKey);
    var request = new HttpRequestMessage(HttpMethod.Post, linePayBaseApiUrl + requestUrl)
    {
        Content = new StringContent(json,Encoding.UTF8, "application/json")
    };
    var result = SignatureProvider.HMACSHA256(channelSecretKey, channelSecretKey + requestUrl + json + nonce);
    client.DefaultRequestHeaders.Add("X-LINE-ChannelId", channelId);
    client.DefaultRequestHeaders.Add("X-LINE-Authorization-Nonce", nonce);
    client.DefaultRequestHeaders.Add("X-LINE-Authorization", result);
    var response = await client.SendAsync(request);

    return _jsonProvider.Deserialize<PaymentConfirmResponseDto>(await response.Content.ReadAsStringAsync());
}
  • LinePayController 內新增 API
HttpPost("PayPreapproved/{regKey}")]
public async Task<PaymentConfirmResponseDto> PayPreapproved([FromRoute] string regKey, PayPreapprovedDto dto)
{
    return await _linePayService.PayPreapproved(regKey, dto);
}

Expire RegKey 文件連結

此 API 可主動將 regKey 過期失效。

  • 文件內容

  • LinePayService 中新增 ExpireRegKey function

public async Task<PaymentConfirmResponseDto> ExpireRegKey(string regKey)
{
    var nonce = Guid.NewGuid().ToString();
    var requestUrl = string.Format("/v3/payments/preapprovedPay/{0}/expire", regKey);
    var request = new HttpRequestMessage(HttpMethod.Post, linePayBaseApiUrl + requestUrl);
    var result = SignatureProvider.HMACSHA256(channelSecretKey, channelSecretKey + requestUrl + nonce);
    client.DefaultRequestHeaders.Add("X-LINE-ChannelId", channelId);
    client.DefaultRequestHeaders.Add("X-LINE-Authorization-Nonce", nonce);
    client.DefaultRequestHeaders.Add("X-LINE-Authorization", result);
    var response = await client.SendAsync(request);

    return _jsonProvider.Deserialize<PaymentConfirmResponseDto>(await response.Content.ReadAsStringAsync());
}
  • LinePayController 內新增 API
[HttpPost("PayPreapproved/{regKey}")]
public async Task<PaymentConfirmResponseDto> ExpireRegKey(string regKey)
{
    return await _linePayService.ExpireRegKey(regKey);
}

補充 API 介紹

這邊補充介紹其餘幾隻 Line Pay 的 API,供大家參考 ~ 不過礙於篇幅... 實作的部份就留給各位做練習 ~
(*遇到卡關的部份或需要討論的部份,可以再留言讓我們知道)

Capture 文件連結

Capture API,用於請款並完成交易的API。

要使用此 API ,首先需在一開始交易請求建立時設定將 確認交易 Confirm請款 Purchase 分開,則當該交易經過 Confirm 時會進入 hold and wait 的狀態,也就是等待請款,最後使用此 Capture API 即可完成交易。

* 備註: 請求交易中的 option.payment.capture 屬性設定經過測試目前在 sandbox 中無法使用,所以無法測試。

  • 文件內容

Void 文件連結

取消 已授權 交易的 API。

當使用者已授權但並未完成之交易,可以使用此 API 取消該交易。

  • 文件內容

Refund

已完成 的交易退款。

當交易已完成後若需要退款,則使用此 API 將交易取消並退回款項。

  • 文件內容

Payment Detail 文件連結

根據 TransactionId & OrderID 取得 Line Pay 交易紀錄。

* 備註 : 這是目前第一個 Http Method 為 Get 的 API,其 authorization header 的 signature 要帶入 query parameter 的內容去做。

  • 文件內容

Check Payment Status 文件連結

根據 TransactionId 取得該筆交易目前的狀態。

  • 文件內容

結語

Line Pay 的串接就到這邊結束了,從這二天的介紹,應該看的出來 Line Pay 的串接並不困難,但卻能夠快速的將商業服務與 Line Pay 做結合,完成了金流的串接,替想開設網路商城的店家解決了一大煩惱。
也因為如此,如果想做Side Project或是想打通金流的朋友 ~~~ 真的是可以花點時間投資在這個主題上,相信應該會有不少收穫。 (*比如說,專案實務上,金流相關的資訊/動作該如何記錄,交易量大的時候該如何解決,甚至交易中斷/錯誤處理 等情形)

有關LINE相關服務的介紹及範例,到今天算是告一個段落 ~
後續的篇幅 會接著帶大家往專案的下一個階段 - 部署(Deployment)
下一篇會帶各位在Linux(CentOS)環境上,搭配 Kestrel 來進行 .Net Core API 的部署 ~ 明天見囉

範例程式碼

如果想要參考今天範例程式碼的部份,下面是 Git Repo 連結,方便大家參考。


上一篇
[Day 24] .NET 6 C# 與 Line Services API 開發 - Line Pay 串接 (一)
下一篇
[Day 26] .NET 6 C# 與 Line Services API 開發 - 在 Centos 部署 .Net Core API (Kestrel)
系列文
讓 C# 也可以很 Social - 在 .NET 6 用 C# 串接 LINE Services API 的取經之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言